package org.codehaus.mojo.jaxb2.schemageneration;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.codehaus.mojo.jaxb2.AbstractJaxbMojo;
import org.codehaus.mojo.jaxb2.shared.FileSystemUtilities;
import org.codehaus.mojo.jaxb2.shared.filters.Filter;
import org.codehaus.mojo.jaxb2.shared.filters.Filters;
import org.codehaus.mojo.jaxb2.shared.filters.pattern.PatternFileFilter;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* <p>Mojo that creates XML schema(s) from test-scope Java testSources or binaries
* by invoking the JAXB SchemaGenerator. This implementation is tailored to use the
* JAXB Reference Implementation from project Kenai.</p>
* <p>Note that the TestSchemaGenerationMojo was completely re-implemented for the 2.x versions.
* Its configuration semantics and parameter set is <strong>not backwards compatible</strong>
* with the 1.x plugin versions. If you are upgrading from version 1.x of the plugin, read
* the documentation carefully.</p>
*
* @author <a href="mailto:lj@jguru.se">Lennart Jörelid</a>
* @see <a href="https://jaxb.java.net/">The JAXB Reference Implementation</a>
*/
@Mojo(name = "testSchemagen",
defaultPhase = LifecyclePhase.GENERATE_TEST_RESOURCES,
requiresDependencyResolution = ResolutionScope.TEST,
threadSafe = true)
public class TestSchemaGenerationMojo extends AbstractXsdGeneratorMojo {
/**
* The last part of the stale fileName for this TestSchemaGenerationMojo.
*/
public static final String STALE_FILENAME = "testSchemaGenerationStaleFlag";
/**
* Default exclude file name suffixes for testSources, used unless overridden by an
* explicit configuration in the {@code testSchemaSourceExcludeFilters} parameter.
*/
public static final List<Filter<File>> STANDARD_TEST_SOURCE_EXCLUDE_FILTERS;
static {
final List<Filter<File>> testSrcTemp = new ArrayList<Filter<File>>();
testSrcTemp.addAll(AbstractJaxbMojo.STANDARD_EXCLUDE_FILTERS);
testSrcTemp.add(new PatternFileFilter(Arrays.asList("\\.xjb", "\\.xsd", "\\.properties"), true));
STANDARD_TEST_SOURCE_EXCLUDE_FILTERS = Collections.unmodifiableList(testSrcTemp);
}
/**
* <p>Parameter holding List of paths to files and/or directories which should be recursively searched
* for Java source files. Only files or directories that actually exist will be included (in the case of files)
* or recursively searched for source files to include (in the case of directories or JARs).
* Configure using standard Maven structure for Lists:</p>
* <pre>
* <code>
* <configuration>
* ...
* <testSources>
* <testSource>/a/full/absolute/path/to/a/SourceFile.java</testSource>
* <testSource>target/some/sourceJar.jar</test>
* <testSource>src/test/java</test>
* </testSources>
* </configuration>
* </code>
* </pre>
* <p><strong>Note</strong>: if configured, the sources parameters replace the default
* value, which is a List containing the paths to the directories defined by
* {@code getProject().getBuild().getTestSourceDirectory()}.</p>
*
* @since 2.0
*/
@Parameter(required = false)
private List<String> testSources;
/**
* <p>Parameter holding a List of Filters, used to match all files under the {@code testSources} directories
* which should <strong>not</strong> be considered SchemaGenerator testSource files. (The filters identify files to
* exclude, and hence this parameter is called {@code testSchemaSourceExcludeFilters}). If a file under any of the
* testSource directories matches at least one of the Filters supplied in the
* {@code testSchemaSourceExcludeFilters}, it is not considered an XJC test source file, and therefore excluded
* from processing.</p>
* <p>If not explicitly provided, the Mojo uses the value within {@code STANDARD_TEST_SOURCE_EXCLUDE_FILTERS}.
* The algorithm for finding XJC sources is as follows:</p>
* <ol>
* <li>Find all files given in the testSources List. Any Directories provided are searched for files
* recursively.</li>
* <li>Exclude any found files matching any of the supplied {@code testSchemaSourceExcludeFilters} List.</li>
* <li>The remaining Files are submitted for processing by the XJC tool.</li>
* </ol>
* <p><strong>Example:</strong> The following configuration would exclude any testSources whose names end with
* {@code .txt} or {@code .foo}:</p>
* <pre>
* <code>
* <configuration>
* ...
* <testSchemaSourceExcludeFilters>
* <filter implementation="org.codehaus.mojo.jaxb2.shared.filters.pattern.PatternFileFilter">
* <patterns>
* <pattern>\.txt</pattern>
* <pattern>\.foo</pattern>
* </patterns>
* </filter>
* </testSchemaSourceExcludeFilters>
* </configuration>
* </code>
* </pre>
* <p>Note that inner workings of the Dependency Injection mechanism used by Maven Plugins (i.e. the DI from
* the Plexus container) requires that the full class name to the Filter implementation should be supplied for
* each filter, as is illustrated in the sample above. This is true also if you implement custom Filters.</p>
*
* @see #STANDARD_TEST_SOURCE_EXCLUDE_FILTERS
* @see org.codehaus.mojo.jaxb2.shared.filters.pattern.PatternFileFilter
* @see org.codehaus.mojo.jaxb2.shared.filters.pattern.AbstractPatternFilter
* @see org.codehaus.mojo.jaxb2.shared.filters.AbstractFilter
*/
@Parameter(required = false)
private List<Filter<File>> testSchemaSourceExcludeFilters;
/**
* <p>The directory where the generated XML Schema file(s) will be placed.</p>
*/
@Parameter(defaultValue = "${project.build.directory}/generated-test-resources/schemagen", required = true)
private File outputDirectory;
/**
* <p>The directory where the {@code schemagen} tool will output XSDs, episode files - and intermediary bytecode
* files. From this directory the XSDs and the episode file (but not the bytecode files) will be copied to the
* outputDirectory for further processing.</p>
*
* @see #outputDirectory
*/
@Parameter(defaultValue = "${project.build.directory}/schemagen-work/test_scope", required = true)
private File testWorkDirectory;
/**
* {@inheritDoc}
*/
@Override
protected List<URL> getCompiledClassNames() {
final List<Filter<File>> excludeFilters = testSchemaSourceExcludeFilters == null
? STANDARD_BYTECODE_EXCLUDE_FILTERS
: testSchemaSourceExcludeFilters;
Filters.initialize(getLog(), excludeFilters);
final List<String> defaultTestSources = getProject().getTestCompileSourceRoots();
try {
return FileSystemUtilities.filterFiles(
getProject().getBasedir(),
(testSources == null) ? defaultTestSources : testSources,
defaultTestSources,
getLog(),
"test-compiled bytecode",
excludeFilters);
} catch (Exception e) {
throw new IllegalStateException("Could not resolve test classpath elements.", e);
}
}
/**
* {@inheritDoc}
*/
@Override
protected List<String> getClasspath() throws MojoExecutionException {
List<String> toReturn = null;
try {
toReturn = getProject().getTestClasspathElements();
} catch (DependencyResolutionRequiredException e) {
throw new MojoExecutionException("Could not acquire compile classpath elements from MavenProject", e);
}
// All done.
return toReturn;
}
/**
* {@inheritDoc}
*/
@Override
protected List<URL> getSources() {
final List<Filter<File>> excludeFilters = testSchemaSourceExcludeFilters == null
? STANDARD_TEST_SOURCE_EXCLUDE_FILTERS
: testSchemaSourceExcludeFilters;
Filters.initialize(getLog(), excludeFilters);
return FileSystemUtilities.filterFiles(
getProject().getBasedir(),
testSources,
getProject().getTestCompileSourceRoots(),
getLog(),
"test schema sources",
excludeFilters);
}
/**
* {@inheritDoc}
*/
@Override
protected File getOutputDirectory() {
return outputDirectory;
}
/**
* {@inheritDoc}
*/
@Override
protected String getStaleFileName() {
return STALE_FILENAME;
}
/**
* {@inheritDoc}
*/
@Override
protected File getWorkDirectory() {
return testWorkDirectory;
}
}